package com.qf.utils;

import lombok.experimental.Accessors;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 验证码的工具类
 * @author: lch
 * @Date:2023/2/15
 */
public class CodeUtils {
    /**
     * Hashtable锁的是整个数组
     * ConcurrentHashMap锁的是桶，即一个单位(线程安全效率也比上面的高)
     */

    /**
     * 内部的数据实体
     */
    @lombok.Data
    @Accessors(chain = true)
    private static class Data{
        private Integer code;
        private Long ms;
    }

    //创建Map集合来存储处理验证码，前面的String在该项目是手机号
    private static Map<String,Data> codeMap = new ConcurrentHashMap<>();

    //将验证码存入Map集合里方便操作   static希望全局只一份
    public static void setCode(String key,Integer code){
        codeMap.put(key,new Data()
                .setCode(code)
                .setMs(System.currentTimeMillis()));
    }
    /**
     * 生成验证码
     * 随机的5位数字
     * @return
     */
    public static Integer createCode(){
        int code = (int)(Math.random() * 90000 + 10000);//[1000~10000)  随机10000到99999
        return code;
    }
    /**
     * 获取验证码
     * @return
     */
    public static Integer getCode(String key){
        //以key取出values
        Data data = codeMap.get(key);
        if (data == null) return null;

        long ttl = 300000L;
        //发送验证码的时间 加上 过时的期限 和当前时间比较
        if (data.getMs() + ttl < System.currentTimeMillis()) {
            //已经过了时效性
            CodeUtils.remove(key);
            return null;
        }
        return data.getCode();
    }

    /**
     * 删除验证码
     * @return
     */
    public static void remove(String key) {
        codeMap.remove(key);
    }
}
